#!/bin/bash

# AIDE 任务管理系统 - 完整初始化脚本
# 版本: 1.0.0
# 适用于: Ubuntu/Debian/CentOS 等 Linux 系统
# 作者: AIDE Team

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color

# 图标定义
SUCCESS="✅"
ERROR="❌"
WARNING="⚠️ "
INFO="ℹ️ "
ROCKET="🚀"
WRENCH="🔧"
PACKAGE="📦"
DATABASE="🗄️ "
DOCKER="🐳"
CHECK="🔍"

# 日志函数
log_info() {
    echo -e "${CYAN}${INFO}${NC} $1"
}

log_success() {
    echo -e "${GREEN}${SUCCESS}${NC} $1"
}

log_error() {
    echo -e "${RED}${ERROR}${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}${WARNING}${NC} $1"
}

log_step() {
    echo -e "${BLUE}${ROCKET}${NC} ${WHITE}$1${NC}"
}

log_substep() {
    echo -e "   ${PURPLE}${WRENCH}${NC} $1"
}

# 全局变量
AIDE_DIR=""
DB_PASSWORD=""
DOCKER_AVAILABLE=false
POSTGRES_RUNNING=false
NODE_AVAILABLE=false
PROJECT_INITIALIZED=false

# 显示欢迎信息
show_welcome() {
    clear
    echo -e "${CYAN}"
    cat << 'EOF'
    ╔══════════════════════════════════════════════════════════════╗
    ║                                                              ║
    ║                 🤖 AIDE 任务管理系统                          ║
    ║                     初始化安装脚本                            ║
    ║                                                              ║
    ║     智能任务管理 | 看板视图 | AI助手 | 多用户支持              ║
    ║                                                              ║
    ╚══════════════════════════════════════════════════════════════╝
EOF
    echo -e "${NC}"
    echo ""
    log_info "欢迎使用 AIDE 任务管理系统初始化脚本"
    echo ""
}

# 检查系统环境
check_system() {
    log_step "检查系统环境"
    
    # 检查操作系统
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        log_success "操作系统: Linux"
        
        # 检查发行版
        if [ -f /etc/os-release ]; then
            . /etc/os-release
            log_info "发行版: $NAME $VERSION"
        fi
    else
        log_warning "检测到非Linux系统，某些功能可能不可用"
    fi
    
    # 检查权限
    if [ "$EUID" -eq 0 ]; then
        log_warning "检测到root用户，建议使用普通用户运行"
    fi
    
    # 检查网络连接
    log_substep "检查网络连接"
    if ping -c 1 google.com &> /dev/null || ping -c 1 baidu.com &> /dev/null; then
        log_success "网络连接正常"
    else
        log_error "网络连接异常，可能影响依赖下载"
    fi
}

# 检查必需软件
check_dependencies() {
    log_step "检查必需软件"
    
    # 检查Node.js
    log_substep "检查Node.js"
    if command -v node &> /dev/null; then
        NODE_VERSION=$(node --version)
        log_success "Node.js已安装: $NODE_VERSION"
        
        # 检查版本
        NODE_MAJOR=$(echo $NODE_VERSION | cut -d'.' -f1 | sed 's/v//')
        if [ "$NODE_MAJOR" -ge 16 ]; then
            NODE_AVAILABLE=true
            log_success "Node.js版本满足要求 (>=16.x)"
        else
            log_error "Node.js版本过低，需要16.x或更高版本"
        fi
    else
        log_error "Node.js未安装"
        log_info "安装方法: curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && sudo apt-get install -y nodejs"
    fi
    
    # 检查npm
    log_substep "检查npm"
    if command -v npm &> /dev/null; then
        NPM_VERSION=$(npm --version)
        log_success "npm已安装: $NPM_VERSION"
    else
        log_error "npm未安装"
    fi
    
    # 检查Docker
    log_substep "检查Docker"
    if command -v docker &> /dev/null; then
        DOCKER_VERSION=$(docker --version)
        log_success "Docker已安装: $DOCKER_VERSION"
        
        # 检查Docker服务状态
        if systemctl is-active --quiet docker; then
            DOCKER_AVAILABLE=true
            log_success "Docker服务正在运行"
        else
            log_warning "Docker服务未运行，尝试启动: sudo systemctl start docker"
        fi
        
        # 检查Docker权限
        if docker ps &> /dev/null; then
            log_success "Docker权限正常"
        else
            log_warning "Docker权限不足，可能需要: sudo usermod -aG docker $USER"
        fi
    else
        log_warning "Docker未安装（可选，但推荐用于数据库）"
        log_info "安装方法: curl -fsSL https://get.docker.com | sh"
    fi
    
    # 检查PostgreSQL客户端
    log_substep "检查PostgreSQL客户端"
    if command -v psql &> /dev/null; then
        PSQL_VERSION=$(psql --version)
        log_success "PostgreSQL客户端已安装: $PSQL_VERSION"
    else
        log_warning "PostgreSQL客户端未安装（可选）"
        log_info "安装方法: sudo apt-get install postgresql-client"
    fi
    
    # 检查Git
    log_substep "检查Git"
    if command -v git &> /dev/null; then
        GIT_VERSION=$(git --version)
        log_success "Git已安装: $GIT_VERSION"
    else
        log_error "Git未安装"
        log_info "安装方法: sudo apt-get install git"
    fi
}

# 获取项目代码
setup_project() {
    log_step "设置项目代码"
    
    # 获取当前目录
    CURRENT_DIR=$(pwd)
    
    # 检查是否在AIDE项目目录中
    if [ -f "package.json" ] && grep -q "aide-prototype" package.json 2>/dev/null; then
        log_success "检测到AIDE项目目录: $CURRENT_DIR"
        AIDE_DIR="$CURRENT_DIR"
    else
        log_warning "未在AIDE项目目录中"
        
        # 检查是否有aide目录
        if [ -d "aide" ]; then
            log_info "发现aide目录，进入检查"
            cd aide
            if [ -f "package.json" ] && grep -q "aide-prototype" package.json 2>/dev/null; then
                log_success "找到AIDE项目: $(pwd)"
                AIDE_DIR="$(pwd)"
            else
                log_error "aide目录不是有效的AIDE项目"
            fi
        else
            log_error "请在AIDE项目目录中运行此脚本，或确保有aide子目录"
            exit 1
        fi
    fi
    
    cd "$AIDE_DIR"
    
    # 检查项目结构
    log_substep "检查项目结构"
    
    if [ -d "frontend" ] && [ -d "backend" ]; then
        log_success "项目结构完整"
    else
        log_error "项目结构不完整，缺少frontend或backend目录"
        exit 1
    fi
    
    # 检查关键文件
    local missing_files=()
    
    [ ! -f "backend/package.json" ] && missing_files+=("backend/package.json")
    [ ! -f "frontend/package.json" ] && missing_files+=("frontend/package.json")
    [ ! -f "backend/src/database/init.sql" ] && missing_files+=("backend/src/database/init.sql")
    
    if [ ${#missing_files[@]} -gt 0 ]; then
        log_error "缺少关键文件:"
        for file in "${missing_files[@]}"; do
            log_error "  - $file"
        done
        exit 1
    else
        log_success "关键文件检查通过"
    fi
}

# 安装项目依赖
install_dependencies() {
    log_step "安装项目依赖"
    
    if [ "$NODE_AVAILABLE" != true ]; then
        log_error "Node.js不可用，无法安装依赖"
        exit 1
    fi
    
    # 安装根目录依赖
    log_substep "安装根目录依赖"
    if [ -f "package.json" ]; then
        npm install || {
            log_error "根目录依赖安装失败"
            exit 1
        }
        log_success "根目录依赖安装完成"
    fi
    
    # 安装后端依赖
    log_substep "安装后端依赖"
    cd backend
    npm install || {
        log_error "后端依赖安装失败"
        exit 1
    }
    log_success "后端依赖安装完成"
    
    # 安装前端依赖
    log_substep "安装前端依赖"
    cd ../frontend
    npm install || {
        log_error "前端依赖安装失败"
        exit 1
    }
    log_success "前端依赖安装完成"
    
    cd "$AIDE_DIR"
}

# 设置数据库
setup_database() {
    log_step "设置数据库"
    
    # 询问数据库设置方式
    echo ""
    log_info "请选择数据库设置方式:"
    echo "  1) 使用Docker创建PostgreSQL (推荐)"
    echo "  2) 使用现有PostgreSQL服务器"
    echo "  3) 跳过数据库设置"
    echo ""
    read -p "请选择 (1-3): " db_choice
    
    case $db_choice in
        1)
            setup_database_docker
            ;;
        2)
            setup_database_existing
            ;;
        3)
            log_warning "跳过数据库设置，请手动配置"
            return 0
            ;;
        *)
            log_error "无效选择"
            exit 1
            ;;
    esac
}

# 使用Docker设置数据库
setup_database_docker() {
    log_substep "使用Docker设置PostgreSQL"
    
    if [ "$DOCKER_AVAILABLE" != true ]; then
        log_error "Docker不可用，请选择其他方式或安装Docker"
        exit 1
    fi
    
    # 生成随机密码
    DB_PASSWORD=$(openssl rand -base64 12 | tr -d "=+/" | cut -c1-12)
    log_info "生成数据库密码: $DB_PASSWORD"
    
    # 停止并删除现有容器
    log_substep "清理现有PostgreSQL容器"
    docker stop postgres-aide 2>/dev/null || true
    docker rm postgres-aide 2>/dev/null || true
    docker volume rm postgres_data 2>/dev/null || true
    
    # 创建新的PostgreSQL容器
    log_substep "创建PostgreSQL容器"
    docker run \
        --name postgres-aide \
        -e POSTGRES_PASSWORD="$DB_PASSWORD" \
        -e POSTGRES_DB=aide \
        -p 5432:5432 \
        -v postgres_aide_data:/var/lib/postgresql/data \
        -d postgres:latest || {
        log_error "PostgreSQL容器创建失败"
        exit 1
    }
    
    log_success "PostgreSQL容器创建成功"
    
    # 等待数据库启动
    log_substep "等待数据库启动"
    local max_attempts=30
    local attempt=1
    
    while [ $attempt -le $max_attempts ]; do
        if docker exec postgres-aide pg_isready -U postgres &> /dev/null; then
            log_success "数据库启动完成"
            POSTGRES_RUNNING=true
            break
        fi
        
        echo -n "."
        sleep 2
        attempt=$((attempt + 1))
    done
    
    if [ "$POSTGRES_RUNNING" != true ]; then
        log_error "数据库启动超时"
        docker logs postgres-aide
        exit 1
    fi
    
    # 测试连接
    log_substep "测试数据库连接"
    if docker exec postgres-aide psql -U postgres -d aide -c "SELECT 'Connection OK' as status;" &> /dev/null; then
        log_success "数据库连接测试成功"
    else
        log_error "数据库连接测试失败"
        exit 1
    fi
    
    # 设置环境变量
    export DATABASE_URL="postgresql://postgres:$DB_PASSWORD@localhost:5432/aide"
    log_success "数据库环境变量已设置"
}

# 使用现有数据库
setup_database_existing() {
    log_substep "配置现有PostgreSQL"
    
    echo ""
    read -p "数据库主机 (默认: localhost): " db_host
    db_host=${db_host:-localhost}
    
    read -p "数据库端口 (默认: 5432): " db_port
    db_port=${db_port:-5432}
    
    read -p "数据库用户名 (默认: postgres): " db_user
    db_user=${db_user:-postgres}
    
    read -s -p "数据库密码: " db_password
    echo ""
    
    read -p "数据库名称 (默认: aide): " db_name
    db_name=${db_name:-aide}
    
    # 设置环境变量
    export DATABASE_URL="postgresql://$db_user:$db_password@$db_host:$db_port/$db_name"
    
    # 测试连接
    log_substep "测试数据库连接"
    cd backend
    
    if node -e "
        const { Pool } = require('pg');
        const pool = new Pool({ connectionString: process.env.DATABASE_URL });
        pool.connect()
            .then(client => { client.release(); console.log('OK'); process.exit(0); })
            .catch(err => { console.error(err.message); process.exit(1); });
    " &> /dev/null; then
        log_success "数据库连接测试成功"
        POSTGRES_RUNNING=true
    else
        log_error "数据库连接测试失败，请检查配置"
        exit 1
    fi
    
    cd "$AIDE_DIR"
}

# 初始化数据库
initialize_database() {
    log_step "初始化数据库"
    
    if [ "$POSTGRES_RUNNING" != true ]; then
        log_warning "数据库未运行，跳过初始化"
        return 0
    fi
    
    cd backend
    
    log_substep "运行数据库初始化脚本"
    if node init-database-fixed.js; then
        log_success "数据库初始化完成"
    else
        log_error "数据库初始化失败"
        exit 1
    fi
    
    cd "$AIDE_DIR"
}

# 构建项目
build_project() {
    log_step "构建项目"
    
    # 构建前端
    log_substep "构建前端"
    if npm run build:frontend; then
        log_success "前端构建完成"
    else
        log_error "前端构建失败"
        exit 1
    fi
    
    # 检查后端
    log_substep "检查后端"
    cd backend
    if npm run build 2>/dev/null || [ -f "src/index.ts" ]; then
        log_success "后端检查通过"
    else
        log_error "后端检查失败"
        exit 1
    fi
    
    cd "$AIDE_DIR"
    PROJECT_INITIALIZED=true
}

# 创建环境配置文件
create_env_files() {
    log_step "创建环境配置文件"
    
    # 创建后端环境文件
    log_substep "创建后端环境文件"
    cat > backend/.env << EOF
# AIDE 后端环境配置
NODE_ENV=development
PORT=5000

# 数据库配置
DATABASE_URL=${DATABASE_URL}

# JWT密钥 (生产环境请更改)
JWT_SECRET=$(openssl rand -base64 32)

# OpenAI API (可选)
# OPENAI_API_KEY=your_openai_api_key_here

# 邮件服务配置 (可选)
# SMTP_HOST=smtp.gmail.com
# SMTP_PORT=587
# SMTP_USER=your_email@gmail.com
# SMTP_PASS=your_email_password

# 短信服务配置 (可选)
# SMS_API_KEY=your_sms_api_key
# SMS_API_SECRET=your_sms_api_secret
EOF
    
    log_success "后端环境文件创建完成"
    
    # 创建前端环境文件
    log_substep "创建前端环境文件"
    cat > frontend/.env << EOF
# AIDE 前端环境配置
VITE_API_BASE_URL=http://localhost:5000/api
VITE_APP_NAME=AIDE 任务管理系统
VITE_APP_VERSION=1.0.0
EOF
    
    log_success "前端环境文件创建完成"
}

# 创建启动脚本
create_startup_scripts() {
    log_step "创建启动脚本"
    
    # 创建开发启动脚本
    log_substep "创建开发启动脚本"
    cat > start-dev.sh << 'EOF'
#!/bin/bash
# AIDE 开发环境启动脚本

echo "🚀 启动AIDE开发环境..."

# 检查数据库
if ! docker ps | grep -q postgres-aide; then
    echo "🔧 启动数据库容器..."
    docker start postgres-aide || {
        echo "❌ 数据库启动失败"
        exit 1
    }
    sleep 5
fi

# 启动应用
echo "🎯 启动前后端服务..."
npm run dev
EOF
    
    chmod +x start-dev.sh
    log_success "开发启动脚本创建完成"
    
    # 创建生产启动脚本
    log_substep "创建生产启动脚本"
    cat > start-prod.sh << 'EOF'
#!/bin/bash
# AIDE 生产环境启动脚本

echo "🚀 启动AIDE生产环境..."

# 设置环境变量
export NODE_ENV=production

# 检查数据库
if ! docker ps | grep -q postgres-aide; then
    echo "🔧 启动数据库容器..."
    docker start postgres-aide || {
        echo "❌ 数据库启动失败"
        exit 1
    }
    sleep 5
fi

# 构建前端（如果需要）
if [ ! -d "frontend/dist" ]; then
    echo "📦 构建前端..."
    npm run build:frontend
fi

# 启动后端
echo "🎯 启动后端服务..."
cd backend
npm start
EOF
    
    chmod +x start-prod.sh
    log_success "生产启动脚本创建完成"
}

# 显示完成信息
show_completion() {
    clear
    echo -e "${GREEN}"
    cat << 'EOF'
    ╔══════════════════════════════════════════════════════════════╗
    ║                                                              ║
    ║                 🎉 AIDE 初始化完成！                          ║
    ║                                                              ║
    ║             您的智能任务管理系统已准备就绪                    ║
    ║                                                              ║
    ╚══════════════════════════════════════════════════════════════╝
EOF
    echo -e "${NC}"
    
    echo ""
    log_success "系统初始化完成！"
    echo ""
    
    # 显示配置信息
    log_info "📋 配置信息:"
    echo "   项目目录: $AIDE_DIR"
    if [ -n "$DATABASE_URL" ]; then
        echo "   数据库: PostgreSQL (Docker容器)"
        if [ -n "$DB_PASSWORD" ]; then
            echo "   数据库密码: $DB_PASSWORD"
        fi
    fi
    echo ""
    
    # 显示启动方法
    log_info "🚀 启动方法:"
    echo ""
    echo "   开发环境:"
    echo "   ./start-dev.sh"
    echo ""
    echo "   或手动启动:"
    echo "   npm run dev"
    echo ""
    echo "   生产环境:"
    echo "   ./start-prod.sh"
    echo ""
    
    # 显示访问地址
    log_info "🌐 访问地址:"
    echo "   前端: http://localhost:3000"
    echo "   后端: http://localhost:5000"
    echo "   API文档: http://localhost:5000/api/health"
    echo ""
    
    # 显示重要提示
    log_warning "📝 重要提示:"
    echo "   1. 首次访问需要注册用户账号"
    echo "   2. 数据库密码已保存在 backend/.env 文件中"
    echo "   3. 生产环境请修改 JWT_SECRET 和其他敏感配置"
    echo "   4. 建议定期备份数据库数据"
    echo ""
    
    # 显示下一步
    log_info "📚 下一步:"
    echo "   - 配置OpenAI API密钥以启用AI功能"
    echo "   - 配置SMTP以启用邮件通知"
    echo "   - 查看文档了解更多功能"
    echo ""
    
    log_success "开始使用 AIDE 任务管理系统吧！ 🎯"
}

# 主函数
main() {
    show_welcome
    
    # 检查系统和依赖
    check_system
    check_dependencies
    
    # 如果关键依赖缺失，提示安装
    if [ "$NODE_AVAILABLE" != true ]; then
        log_error "Node.js是必需的，请先安装"
        echo ""
        log_info "Ubuntu/Debian安装方法:"
        echo "curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -"
        echo "sudo apt-get install -y nodejs"
        echo ""
        exit 1
    fi
    
    # 设置项目
    setup_project
    install_dependencies
    setup_database
    initialize_database
    build_project
    create_env_files
    create_startup_scripts
    
    # 显示完成信息
    show_completion
}

# 错误处理
trap 'log_error "脚本执行过程中发生错误，请检查上述输出"; exit 1' ERR

# 运行主函数
main "$@"
